package com.itheima.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Category;
import com.itheima.common.R;
import com.itheima.exception.CustomException;
import com.itheima.service.CategoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequestMapping("/category")
@RestController
public class CategoryController {

    @Autowired
    private CategoryService categoryService;

    //新增分类
    @PostMapping
    public R<String> add(@RequestBody Category category){
        //1.补全字段【不需要了 直接使用MyBatisPlus公共字段自动填充】
        //2.调用service完成新增  注意：分类名称是唯一的
        //2.1：根据分类名称查询 判断是否存在
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Category::getName,category.getName());
        int count = categoryService.count(wrapper);//根据查询条件 统计符合条件的总记录数
        if(count>0){
            throw new CustomException("套餐分类【"+category.getName()+"】已经存在！");
        }

        //2.2：如果不存在 执行新增
        boolean flag = categoryService.save(category);

        //3.响应数据
        return flag?R.success("新增成功！"):R.error("新增失败！");
    }

    //分类分页查询
    @GetMapping("/page")
    public R<Page<Category>> findPage(@RequestParam(defaultValue="1") Integer page, @RequestParam(defaultValue="10") Integer pageSize){
        //前提工作：配置MyBatisPlus分页拦截器【已经配置过了】
        //1.调用service完成分页查询
        //1.1：创建Page对象封装分页参数 当前页码page和每页显示条数pageSize
        Page<Category> categoryPage = new Page<>(page, pageSize);

        //1.2：调用service中的page()完成分页查询
        categoryService.page(categoryPage);

        //2.响应分页查询数据
        return R.success(categoryPage);
    }

    //分类删除
    //优化后的
    @DeleteMapping("/{ids}")
    public R<String> delete(@PathVariable Long ids){
        //1.调用service处理
        boolean flag = categoryService.deleteWithDishAndSetmeal(ids);
        //2.响应数据
        return flag?R.success("删除成功！"):R.error("删除失败！");
    }

    //之前的删除
    /*@DeleteMapping
    public R<String> delete(Long ids){
        //1.调用service处理
        boolean flag = categoryService.deleteWithDishAndSetmeal(ids);
        //2.响应数据
        return flag?R.success("删除成功！"):R.error("删除失败！");
    }*/

    //分类修改
    @PutMapping
    public R<String> update(@RequestBody Category category){
        //1.判断修改后的分类名称在数据库表中不存在重复
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Category::getName,category.getName());
        wrapper.ne(Category::getId,category.getId());       //不是自己
        int count = categoryService.count(wrapper);
        if(count>0){
            throw new CustomException("分类名称【"+category.getName()+"】已经存在！");
        }

        //2.调用service完成修改
        boolean flag = categoryService.updateById(category);

        //3.响应数据
        return flag?R.success("修改成功！"):R.error("修改失败！");
    }


    //根据type 查询所有的分类列表数据
    @GetMapping("/list")
    public R<List<Category>> list(Integer type){
        //1.调用service 根据type查询分类类别数据
        LambdaQueryWrapper<Category> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(type!=null,Category::getType,type);  //添加null值处理 如果type为null 不设置条件 查询所有分类列表数据
        List<Category> list = categoryService.list(wrapper);

        //2.响应数据
        return R.success(list);
    }

}
